package com.ljc.db.backend.vm;

import com.ljc.db.backend.tm.TransactionManagerImpl;

import java.util.HashMap;
import java.util.Map;

// vm对一个事务的抽象
public class Transaction {
    public long xid;
    public int level;
    public Map<Long, Boolean> snapshot;     // 快照，用于判断当前事务开始时，其他事务是活跃状态的还是已提交状态
    public Exception err;
    public boolean autoAborted;

    /**
     *  每当一个事务开始时，就会将此时的活跃事务记录到快照中
     */
    public static Transaction newTransaction(long xid, int level, Map<Long, Transaction> active) {
        Transaction t = new Transaction();
        t.xid = xid;
        t.level = level;
        if(level != 0) {
            t.snapshot = new HashMap<>();
            // active保存所有活跃事务的信息
            for(Long x : active.keySet()) {
                t.snapshot.put(x, true);
            }
        }
        return t;
    }

    /**
     *  判断当前事务在刚开始的时刻，有哪些事务是【活跃事务】
     */
    public boolean isInSnapshot(long xid) {
        // 如果事务id是超级事务，则说明为提交状态，不再活跃事务中
        if(xid == TransactionManagerImpl.SUPER_XID) {
            return false;
        }
        return snapshot.containsKey(xid);
    }
}
